// 给定一种规律 pattern 和一个字符串 str ，判断 str 是否遵循相同的规律。
// 这里的 遵循 指完全匹配。
// 例如， pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

const wordPattern = function (pattern: string, s: string): boolean {
    const wordArr: string[] = s.split(' '); //根据空格分词
    if (wordArr.length !== pattern.length) return false; // 如果模式长度和分词长度不吻合可以直接返回了
    // 声明字典和已存表
    const wordMap = new Map<string, string>();
    const mapValue = new Set<string>();
    for (let i = 0; i < wordArr.length; i++) {
        // 判断现有字典中是否存在给定分词
        if (wordMap.has(wordArr[i])) {
            // 存在给定分词判断模式是否匹配，不匹配直接返回false
            if (wordMap.get(wordArr[i]) !== pattern[i]) return false;
        } else {
            // 这里也要先判断模式是否存在重复，要保证key、value双方的唯一性
            if (mapValue.has(pattern[i])) return false;
            // 否则记录分词及对应模式
            wordMap.set(wordArr[i], pattern[i]);
            mapValue.add(pattern[i]);
        }
    }
    return true;
};

wordPattern("abba",
    "dog cat cat fish")

// 这道题目的难度并不大，考察了一个哈希表和哈希集合的使用
// 首先根据空格来对原字符分词，分词以后这里有个边缘情况
// 直接判断分词长度和模式长度是否相等，如果不相等的画直接返回false
// 之后声明一个哈希集合，保证所有存储的value和key值的对应关系都是唯一的且一一对应
// 之后扫描分词数组即可。
